其實在目前我都一直認為
同步執行完之後就會去執行非同步
概觀來說是這樣沒錯,但是在非同步的世界裡面,也有先後順序的。
我會以我目前了解的方式,跟大家share一下,分享一下研究成果XD
首先我目前理解起來執行順序是這樣的
一般同步執行 => nextTick Queue =>
promise callback(.then裡面) => 一般的異步程序
那簡單來介紹一下NextTick Queue 是什麼存在
再來就是 MicroTask Queue(promise 進入.then之後的狀態)
再來提供一下node.js Event Loop的順序
圖片引用自參考文章
直接上code
//一般同步執行 > nextTick Queue > promise callback > 一般的callback
//第一個執行
console.log("同步開始");
process.nextTick(function () {
//第五個執行
console.log("nextTick1");
});
//第十個執行
setTimeout(function () {
console.log("setTimeout如果超過1秒,則在執行的時候跑完一遍整個loop,才會輪到他,所以會在setImmediate之後");
}, 1000);
//第八個執行
setTimeout(function () {
console.log("setTimeout如果是0因為是Timer,就會先被執行會在setImmediate(Check)之上");
}, 0);
new Promise(function (resolve, reject) {
//第二個執行
console.log("promise裡面的同步"); //雖然宣告是 Promise 但沒有進入.then 也就是沒有callback,所以接著執行
resolve("resolve");
}).then(function (result) {
//第七個執行
console.log("promise then,第二優先");
});
(async function () {
//第三個執行
console.log("async本質也還是promise"); // 他本質上也還是promise,沒進入.then 所以log會在第一輪執行
})();
//第九個執行
setImmediate(function () {
console.log("setImmediate,屬於Check");
});
//第六個執行
process.nextTick(function () {
console.log("nextTick2");
setTimeout(function () {
//第十一個執行
console.log("setTimeout即使被包在nextTick2底下,他依舊是setTimeout,依照執行順序會是最後一個,因為秒數最久");
}, 2000);
});
//第四個執行
console.log("同步結束");
大家可以印去玩玩看。
參考資料
裡面有更詳細的解說,我這邊大概就是去體會他的內容,並且去執行印出來,加上一些註解去方便自己去對應loop的規則